/**
 * 
 */
package due.pc.pcshoot.gamelogic;

import java.io.IOException;

import org.anddev.andengine.audio.sound.Sound;
import org.anddev.andengine.audio.sound.SoundFactory;
import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.handler.physics.PhysicsHandler;
import org.anddev.andengine.entity.IEntity;
import org.anddev.andengine.entity.modifier.LoopEntityModifier;
import org.anddev.andengine.entity.modifier.RotationByModifier;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.shape.Shape;
import org.anddev.andengine.util.Debug;

import android.content.Context;
import android.util.Log;

import due.pc.pcshoot.control.OnScreenLogger;
import due.pc.pcshoot.entity.EnemyState;
import due.pc.pcshoot.entity.Helicopter;
import due.pc.pcshoot.entity.IEnemy;

/**
 * @author manhhung.vu
 *
 */
public class HelicopterLogicHandler extends BaseEnemyLogicHandler<Helicopter> implements IEnemyLogicHandler
{
	//===============================================================/
	//Constants
	//===============================================================/
	public static final String SOUND_LANDED = "sound/landed.wav";
	
	//===============================================================/
	//Fields
	//===============================================================/
	private Shape mGround;
	private OnScreenLogger mOnScreenLogger;
	
	private Sound mLandedSound;
	
	//===============================================================/
	//Constructors
	//===============================================================/
	public HelicopterLogicHandler(Shape pGround, Helicopter pEnemy, OnScreenLogger pOnScreenLogger, Scene pScene, Engine pEngine, Context pContext) {
		super(pEnemy, pScene);
		
		mGround = pGround;
		mOnScreenLogger = pOnScreenLogger;
		
		try 
		{
			mLandedSound = SoundFactory.createSoundFromAsset(pEngine.getSoundManager(), pContext, SOUND_LANDED);
		} 
		catch (final IOException e) {
			Debug.e(e);
		}
	}

	
	
	//===============================================================/
	//Inherited Methods
	//===============================================================/
	@Override
	public float onUpdate(float pSecondsElapsed, IEntity pItem) 
	{
		if (mEnemy.getState().equals(EnemyState.HIT)) {
//			if (mEnemy.collidesWith(mGround))
			if (mGround.contains(mEnemy.getX(), mEnemy.getY()) || mEnemy.getY() >= mGround.getY())
			{
				Log.d("HelicopterLogicHandler", "kollision mit boden");
				
				mEnemy.clearEntityModifiers();
				mEnemy.clearUpdateHandlers();
			}
		}
		else if (mEnemy.getState().equals(EnemyState.ACTIVE)) {
			if (mEnemy.collidesWith(mGround)) {
				mEnemy.setState(EnemyState.LANDED);
			}
		}
		
		
		return 0;
	}
	
	@Override
	public void onEnemyStateChanged(EnemyState pState, IEnemy pEnemy) 
	{
//		Log.d("StateChange", pState.toString());
		
		if (pState.equals(EnemyState.ACTIVE)) {
			mEnemy.animate(new long[]{100, 100}, new int[]{1, 2}, -1);
		}
		else if (pState.equals(EnemyState.HIT)) {
//			mEnemy.animate(new long[]{100, 100}, new int[]{3, 3}, 0);
			mEnemy.stopAnimation(3);
			
			mEnemy.clearUpdateHandlers();
			mEnemy.clearEntityModifiers();
			mEnemy.registerEntityModifier(this);
			
			PhysicsHandler physicsHandler = new PhysicsHandler(mEnemy);
			mEnemy.registerUpdateHandler(physicsHandler);
			
			physicsHandler.setAccelerationY(9.8f * 30);
			
			physicsHandler.setVelocityX(mBallVelocityX * 0.4f);
			physicsHandler.setVelocityY(mBallVelocityY * 0.4f);
			
			float angulation = ((mEnemy.getX() + mEnemy.getWidth() / 2) - mFiredPointX >= 0) ? 45 : -45; 
			
			RotationByModifier rotationModifier = new RotationByModifier(0.1f, angulation);
			LoopEntityModifier loopModifier = new LoopEntityModifier(rotationModifier);
			
			mEnemy.registerEntityModifier(loopModifier);
			
		}
		else if (pState.equals(EnemyState.LANDED)) {
			mEnemy.stopAnimation(0);
			
			mEnemy.clearUpdateHandlers();
			mEnemy.clearEntityModifiers();
			mEnemy.registerEntityModifier(this);
			
			mLandedSound.play();
			
			mOnScreenLogger.setLanded(mOnScreenLogger.getLanded() + 1);
		}
	}
	//===============================================================/
	//Methods
	//===============================================================/
	
	
	//===============================================================/
	//Getters & Setters
	//===============================================================/
	
	
	//===============================================================/
	//Static Methods
	//===============================================================/
	
	
	//===============================================================/
	//Inner Classes
	//===============================================================/
}
